package com.wjw.java.others.innerClass_;

/**
 * 成员内部类：定义在外部类的成员位置,没有static修饰
 * 1.可以直接访问外部类的所有成员,包含私有的
 * 2.可以添加任意访问修饰符,因为它的地位就是一个成员
 * 3.作用域：和外部类的其他成员一样,为整个类体,如:
 *   在外部类的成员方法中创建成员内部类对象,然后在调用方法
 * 4.成员内部类访问外部类成员,直接访问
 * 5.外部类访问内部类,先创建对象在访问
 *
 * 6.外部其他类访问内部类的方式,有二种
 * 一、外部类.成员内部类 变量名 = new 外部类().new 成员内部类();
 * 二、在外部类定义一个方法,返回成员内部类
 *
 * 7.如果外部类和成员内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用
 *   外部类名.this.成员
 */
//外部其他类
public class MemberInnerClass {
    public static void main(String[] args) {
        //外部其他类,间接访问成员内部类中的方法
        System.out.println("-----------------------------");
        Outer3 outer3 = new Outer3();
        outer3.useInner3say();
        //6.外部其他类,直接访问内部类的方式
        //方式一：
        System.out.println("-----------------------------");
        Outer3.Inner3 inner3 = new Outer3().new Inner3();
        inner3.say();
        //方式二：
        System.out.println("-----------------------------");
        Outer3.Inner3 inner33 = outer3.getInner3Instance();
        inner33.say();
    }
}
class Outer3{//外部类
    private String name = "张三";
    //成员内部类
    public class Inner3{
        private String name = "李四";
        public void say(){
            System.out.println(name +":你好啊!!!");//李四：你好啊
            System.out.println(Outer3.this.name +":你好啊!!!");;//张三：你好啊
        }
    }
    //调用成员内部类中的方法
    public void useInner3say(){
        Inner3 inner3 = new Inner3();
        inner3.say();
    }
    //方式二
    public Inner3 getInner3Instance(){
        return new Inner3();
    }
}